package br.skytef.stmanager.beans;

import java.io.IOException;
import java.sql.SQLException;
import java.sql.Timestamp;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import jxl.read.biff.BiffException;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

import br.skytef.stmanager.daos.ClienteDAO;
import br.skytef.stmanager.daos.ControlPlanilhaDAO;
import br.skytef.stmanager.daos.DivergenciaClienteDao;
import br.skytef.stmanager.daos.ErroPlanilhaDAO;
import br.skytef.stmanager.daos.ProdutoClienteDao;
import br.skytef.stmanager.daos.ProdutoDao;
import br.skytef.stmanager.daos.SoftwareHouseDao;
import br.skytef.stmanager.entities.ClienteEntity;
import br.skytef.stmanager.entities.ControlPlanilhasEntity;
import br.skytef.stmanager.entities.DivergenciaClienteEntity;
import br.skytef.stmanager.entities.ErroPlanilhaEntity;
import br.skytef.stmanager.entities.ProdutoClienteEntity;
import br.skytef.stmanager.entities.ProdutoEntity;
import br.skytef.stmanager.entities.SoftwareHouseEntity;
import br.skytef.stmanager.utils.Data;
import br.skytef.stmanager.utils.PlanCliente;
import br.skytef.stmanager.utils.PlanFinanceiro;
import br.skytef.stmanager.utils.arquivoLicenca;

@ManagedBean(name="ClienteBean")
@SessionScoped
public class ClienteBean {

	private Timestamp dataAtual = new Data().DtTime();
	private ClienteEntity clienteBanco;
	private ClienteEntity clienteNovo;
	private SoftwareHouseEntity softwareBanco;
	private PlanCliente planilha;
	private PlanFinanceiro planilha2;
	private ControlPlanilhasEntity cp;
	private String fileNameUploaded;

	/**
	 * Método para importação das planilhas.
	 * @param fileUploadEvent
	 * @throws IOException
	 * @throws BiffException
	 * @throws SQLException 
	 */

	public void doUpload (FileUploadEvent fileUploadEvent) throws IOException, BiffException, SQLException{
		UploadedFile uploadedFile = fileUploadEvent.getFile();
		fileNameUploaded = uploadedFile.getFileName();
		int ult = fileNameUploaded.length()-1;
		if(fileNameUploaded.charAt(ult) =='s' &&
				fileNameUploaded.charAt(ult-1) =='l' &&
				fileNameUploaded.charAt(ult-2) =='x' &&
				fileNameUploaded.charAt(ult-3) =='.'){
			planilha = new PlanCliente(uploadedFile.getInputstream());
			planilha2 = new PlanFinanceiro(uploadedFile.getInputstream());
			if (planilha.validar()){
				cp = new ControlPlanilhaDAO().buscar(fileNameUploaded);
				if (cp == null){
					cp = new ControlPlanilhasEntity(fileNameUploaded, planilha.qtlinha()-1, 0, dataAtual);
					new ControlPlanilhaDAO().inserir(cp);
					cp = new ControlPlanilhaDAO().buscar(fileNameUploaded);
				}
				new ErroPlanilhaDAO().delete(cp.getIdcontrolPlanilha());
				for(int i=1; i < planilha.qtlinha(); i++){
					clienteNovo = planilha.importarlinha(i);
					if(clienteNovo == null){
						cp.setErros(cp.getErros() + 1);
						cp.setLinhasImportadas(cp.getLinhasImportadas() - 1);
						new ErroPlanilhaDAO().inserir(new ErroPlanilhaEntity(cp.getIdcontrolPlanilha(), PlanCliente.getLinhaErrada()));
					}else{
						inserirOuAtualizar(clienteNovo);
					}
				}
				new ControlPlanilhaDAO().alterar(cp);

				long fileSizeUploaded = uploadedFile.getSize(); 
				String infoAboutFile = "<br/> Arquivo recebido: <b>"+fileNameUploaded +"</b><br/>"+ "Tamanho do Arquivo: <b>"+fileSizeUploaded+"</b>";
				FacesContext facesContext = FacesContext.getCurrentInstance(); 
				facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", infoAboutFile));
			}else if (planilha2.validar()){
				cp = new ControlPlanilhaDAO().buscar(fileNameUploaded);
				if (cp == null){
					cp = new ControlPlanilhasEntity(fileNameUploaded, planilha2.qtlinha()-1, 0, dataAtual);
					new ControlPlanilhaDAO().inserir(cp);
					cp = new ControlPlanilhaDAO().buscar(fileNameUploaded);
				}
				for(int i=1; i < planilha2.qtlinha(); i++){
					clienteNovo = planilha2.importarlinha(i);
					clienteBanco = new ClienteDAO().buscarCliente(clienteNovo.getCnpj());
					if(clienteNovo == null){
						cp.setErros(cp.getErros() + 1);
						cp.setLinhasImportadas(cp.getLinhasImportadas() - 1);
						new ErroPlanilhaDAO().inserir(new ErroPlanilhaEntity(cp.getIdcontrolPlanilha(), PlanFinanceiro.getLinhaErrada()));
					}else{
						inserirOuAtualizar(clienteNovo);
						divLoja(clienteNovo, planilha2, fileNameUploaded);
					}

				}	
				new ControlPlanilhaDAO().alterar(cp);
				long fileSizeUploaded = uploadedFile.getSize(); 
				String infoAboutFile = "<br/> Arquivo recebido: <b>"+fileNameUploaded +"</b><br/>"+ "Tamanho do Arquivo: <b>"+fileSizeUploaded+"</b>";
				FacesContext facesContext = FacesContext.getCurrentInstance(); 
				facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", infoAboutFile));

			}else{
				FacesContext facesContext = FacesContext.getCurrentInstance();
				if(!planilha2.validar()){
					facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Falha" ,planilha.getMensagemErro()));
				}else if(!planilha.validar()){
					facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Falha" ,planilha2.getMensagemErro()));
				}else{
					facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Falha" , "planilha invália!"));
				}
			}

		}else{
			FacesContext facesContext = FacesContext.getCurrentInstance(); 
			facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Falha", "Formato de arquivo inválido"));
		}
	}

	private void inserirOuAtualizar(ClienteEntity clienteNovo) throws SQLException{
		clienteBanco = new ClienteDAO().buscarCliente(clienteNovo.getCnpj());
		ClienteEntity parceiro = new ClienteDAO().buscar(planilha2.getParceiro());
		if(parceiro != null)
			clienteNovo.setIdParceiro(parceiro.getIdCliente());
		if(clienteBanco != null && clienteNovo.getCnpj() != 0){			
			if(clienteBanco.getCnpj() == clienteNovo.getCnpj()){				
				clienteNovo = validaCampos(clienteNovo, clienteBanco);
				clienteNovo.setData_atualizacao(dataAtual);
				clienteNovo.setIdCliente(clienteBanco.getIdCliente());
				new DivergenciaClienteDao().excluir(clienteNovo.getIdCliente());
				if(planilha2.getQtdLojas() != clienteBanco.getQtdLojas()){
					divergencia(fileNameUploaded, planilha2.getQtdLojas(), clienteBanco.getIdCliente(), "divgLojas");
				}
				if(new ClienteDAO().alterar(clienteNovo)){
					inserirSoftHouse();
					inserirOuAtualizarProdCli();
				}
			}
		}else{
			if(clienteNovo.getCnpj() != 0){				
				clienteNovo.setData_inclusao(dataAtual);
				clienteNovo.setUsuario_id(LoginBean.getUsuarioBD().getId());
				if(new ClienteDAO().inserir(clienteNovo)){
					inserirSoftHouse();
					inserirOuAtualizarProdCli();
				}
			}else{
				FacesContext facesContext = FacesContext.getCurrentInstance(); 
				facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,"Erro ao inserir/alterar:", "Cliente inválido"));
			}
		}

	}	
	private void inserirSoftHouse(){
		clienteBanco = new ClienteDAO().buscarCliente(clienteNovo.getCnpj());
		softwareBanco  = new SoftwareHouseDao().buscarIdCliente(clienteBanco.getIdCliente())  ;
		SoftwareHouseEntity SHE = new SoftwareHouseEntity(planilha.getSoftwareHouse(),clienteBanco.getIdCliente());
		if (planilha.getSoftwareHouse() != null) {
			if (softwareBanco == null ){
				new SoftwareHouseDao().inserir(SHE);
			}else if (!softwareBanco.getNome().equals(planilha.getSoftwareHouse())){ 
				new SoftwareHouseDao().alterar(SHE,clienteBanco.getIdCliente() );
			}
		}
	}

	private void inserirOuAtualizarProdCli(){
		arquivoLicenca al = new arquivoLicenca();
		ProdutoEntity produto;
		clienteBanco = new ClienteDAO().buscarCliente(clienteNovo.getCnpj());
		if (planilha.getArquivoLicenca() != null) {
			String licencaAtual = al.filtro(planilha.getArquivoLicenca());
			if (clienteBanco.getQtdLojas() > 1){
				produto = al.produto(licencaAtual);
				produto = new ProdutoDao().buscar(produto.getNome() + " MULTILOJA");
			}else{
				produto = al.produto(licencaAtual);
			}
			if (produto != null){
				ProdutoClienteEntity prodCli = new ProdutoClienteDao().localiza(clienteBanco.getIdCliente(), produto.getId());
				if(prodCli == null){
					prodCli = new ProdutoClienteEntity();
					prodCli.setVpn_ativa(planilha.getVPNAtiva());
					prodCli.setArquivoLicenca(licencaAtual);
					prodCli.setDataInclusao(dataAtual);
					prodCli.setTipoTarefa(planilha.getTipoTarefa());
					prodCli.setCliente_idCliente(clienteBanco.getIdCliente());
					prodCli.setProduto_id(produto.getId());
					new ProdutoClienteDao().inserir(prodCli);
				}
			}
		}
	}

	private void divLoja(ClienteEntity clienteNovo, PlanFinanceiro planilha2, String nomePlanilha){
		if(clienteNovo.getQtdLojas() != planilha2.getQtdLojas()){
			DivergenciaClienteEntity DCE = new DivergenciaClienteEntity(nomePlanilha, planilha2.getQtdLojas(),"divgLoja",dataAtual, clienteNovo.getIdCliente());
			new DivergenciaClienteDao().inserir(DCE);
		}
	}

	/**
	 * Fim das Inserções.
	 * */

	/**
	 * Método que impede que a Base de Dados seja atualizado para campo nulo ou zero.
	 * @param clienteNovo ClienteEntity (Importado)
	 * @param clienteBanco	ClienteEntity (Resultado da Base de Dados)
	 * @return
	 */
	private ClienteEntity validaCampos(ClienteEntity clienteNovo, ClienteEntity clienteBanco){
		if(clienteNovo.getTelefone() == null)
			clienteNovo.setTelefone(clienteBanco.getTelefone());
		if(clienteNovo.getEmailCliente() == null)
			clienteNovo.setEmailCliente(clienteBanco.getEmailCliente());
		if(clienteNovo.getRazaoSocial() == null)
			clienteNovo.setRazaoSocial(clienteBanco.getRazaoSocial());
		if(clienteNovo.getNomeFantasia() == null)
			clienteNovo.setQtdLojas(clienteBanco.getQtdLojas());
		if(clienteNovo.getMovimentacao() == null)
			clienteNovo.setMovimentacao(clienteBanco.getMovimentacao());
		if(clienteNovo.getDataMovimentecao() == null)
			clienteNovo.setDataMovimentecao(clienteBanco.getDataMovimentecao());
		if(clienteNovo.getResponsavel() == null)
			clienteNovo.setResponsavel(clienteBanco.getResponsavel());
		if(clienteNovo.getResponsavelEmail() == null)
			clienteNovo.setResponsavelEmail(clienteBanco.getResponsavelEmail());
		if(clienteNovo.getAtendSuporte() == null)
			clienteNovo.setAtendSuporte(clienteBanco.getAtendSuporte());
		if(clienteNovo.getValorFaturado()==0)
			clienteNovo.setValorFaturado(clienteBanco.getValorFaturado());
		clienteNovo.setUsuario_id(LoginBean.getUsuarioBD().getId());
		clienteNovo.setData_atualizacao(new Data().DtTime());
		return clienteNovo;
	}

	public void criarControle(String nomePlan, int linhas){
		ControlPlanilhasEntity controle = new ControlPlanilhasEntity(nomePlan, linhas, 0, dataAtual);
		new ControlPlanilhaDAO().inserir(controle);		
	}
	private void divergencia(String plan, double valor, int cliente, String tipo){
		DivergenciaClienteEntity DCE = new DivergenciaClienteDao().buscar(cliente);
		if(DCE != null){
			DCE.setNomePlanilha(plan);
			DCE.setValor(valor);
			DCE.setData_divergencia(new Data().DtTime());
			DCE.setTipo(tipo);
		}else{
			DCE = new DivergenciaClienteEntity(plan, valor, tipo, new Data().DtTime(), cliente);
			new DivergenciaClienteDao().inserir(DCE);
		}
	}
}
